package team.lourd.network.system.batch.ext.support;

import lombok.Data;
import org.springframework.util.StringUtils;
import team.lourd.network.system.batch.domian.ProcessCondition;
import team.lourd.network.system.batch.ext.ConditionAnalyser;
import team.lourd.network.system.batch.ext.ConditionNode;
import team.lourd.network.system.batch.logic.LogicCharacter;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 逻辑标记条件组解析器
 *
 * @author JADemo
 * @date 2019/2/18 11:03
 */
@Data
public class LogicConditionAnalyser implements ConditionAnalyser {
    // 需要分割表达式的逻辑标记
    private String logicSymbol;

    // 解析表达式
    public List<ConditionNode> analyse(ProcessCondition processCondition) {
        // 获取当前条件的条件体
        String conditionContent = processCondition.getContent();
        // 获取条件参数Map,KEY参数名称,VALUE,参数值
        Map<String, Object> parameters = processCondition.getParameters();
        // 为条件体添加上参数
        for (Map.Entry<String, Object> parameterEntry : parameters.entrySet()) {
            conditionContent = conditionContent.replace(parameterEntry.getKey(), parameterEntry.getValue().toString());
        }
        // 如果逻辑标记为NULL那么默认为Or
        if (StringUtils.isEmpty(logicSymbol)) {
            logicSymbol = LogicCharacter.Or.name();
        }
        List<ConditionNode> conditionNodes = new ArrayList<>();
        // 根据指定符号进行条件分割
        String[] conditionNodeTexts = conditionContent.split(logicSymbol);
        // 每一个条件分装成条件节点
        for (String conditionNodeText : conditionNodeTexts) {
            ConditionNode node = new ConditionNode();
            // 为节点设置内容
            node.setContent(conditionNodeText);
            // 默认失败
            node.setSuccess(false);
            conditionNodes.add(node);
        }
        return conditionNodes;
    }
}
